# 字符串判断：从键盘输入一个字符串，判断该字符串是否可以被转换为一个有效的数字
inputString = input("请输入一个数字字符串：")
negative = 0  # 负号数
point = 0  # 小数点数
other = 0  # 非数字符号
digit = 0  # 数字

# 方案1（逆向思维,排除所有的错误就是正确的。）：  -123123.12
# 数字的ascii 范围： 48到57
# - 的ascii 是 45
# . 的ascii 是 46

# 1.步骤一：如何排除？
#  排除： 有点号，负号外的其他字符。
#  排除：  排除多个小数点，多个负号
#  排除:  负号不在首位
#  排除： 小数点在第一位、最后一位
#  排除 ： 负号后面紧跟小数点

# 代码一：计算有几个负号，小数点，非数字负号，数字

for char in inputString:
    if 48 <= ord(char) <= 57:
        digit += 1
    elif ord(char) == 45:
        negative += 1
    elif ord(char) == 46:
        point += 1
    else:
        other += 1
print(f"数字有{digit}个，负号有{negative}个，小数点有{point}个，其他的字符有{other}个。")


# 代码二：排除错误
if other>0:
    print("无效数字")
elif negative>1 or point>1:
    print("无效数字")
elif negative==1 and inputString[0]!="-":
    print("无效数字")
elif point==1 and (inputString[0]=="." or inputString[-1]=="."):
    print("无效数字")
elif inputString[:2]=="-.":
    print("无效数字")
else:
    print("合法数字")




# 等价类
# 1. 有效等价类  49 , -1  , 1.5 , 0
# 2. 无效等价类
#     非数字 ： aaaaa   !@#!#@aa   中文  12a3
#     负号位置不对：    12-3      123-
#     多个小数点：    123.3.4       ..123        123..
#     负数在小数点的后面：   1.-23      123.-       .-123
#     点在负号的后面：    -.123    123-.123       123-.
#     点的位置不对：  .123     123.


# 方案2：后面学了高级的方法可以优化，3行代码即可。  异常！
